// (localstorage sessionStorage)  cookie  和 session 的区别  indexDB

// 本地存储？ (localstorage sessionStorage 有大小限制)
// 浏览器中有一份， session每个窗口有一份 （针对详情页数据存储 应该选用sessionStrorage）
// cookie (客户端可以设置服务端也可以设置) session
// cookie的特点默认每次请求都会携带上，cookie可以跨父子域  baidu.com (www.baidu.com  music.baidu.com)
// cookie 大量设置会浪费流量，不能存储敏感信息 （客户端可以修改） cookie csrf (鉴别会话的？ 是谁来访问过)

// 通过session来存储敏感信息，通过cookie来鉴别用户，通过鉴别后的用户来访问到敏感信息(session 是服务端，客户端无法操作)

// 服务端去写cookie
// 每次携带cookie后 客户端读取出来

const Koa = require("koa");
const app = new Koa();

const Router = require("@koa/router");
const querystring = require("querystring");
const crypto = require("crypto"); // 内置模块
const router = new Router();

app.keys = ["jw"];
// app.use(function (ctx, next) {
//   const cookies = [];
//   ctx.res.setCookie = function (key, value, options = {}) {
//     let str = `${key}=${value}`;
//     if (options.domain) {
//       str += `; domain=${options.domain}`;
//     }
//     if (options.path) {
//       str += `; path=${options.path}`;
//     }
//     if (options.maxAge) {
//       str += `; max-age=${options.maxAge}`;
//     }
//     if (options.httpOnly) {
//       str += `; httpOnly=${options.httpOnly}`;
//     }
//     if (options.signed) {
//       // 要对这个值做签名 ， sha1,  加盐 算法
//       const signed = crypto
//         .createHmac("sha1", keys)
//         .update(`${key}=${value}`)
//         .digest("base64url"); // base64 + _ /

//       cookies.push(`${key}.sign=${signed}`);
//     }
//     cookies.push(str);
//     ctx.res.setHeader("Set-Cookie", cookies);
//   };
//   ctx.req.getCookie = function (key, options = {}) {
//     let cookieObj = querystring.parse(ctx.req.headers["cookie"], "; ", "=");

//     if (options.signed) {
//       // 验签
//       const signed = crypto
//         .createHmac("sha1", keys)
//         .update(`${key}=${cookieObj[key]}`)
//         .digest("base64url");

//       if (cookieObj[`${key}.sign`] === signed) {
//         // 数据签的结果，和之前一样，说明没有窜改
//         return cookieObj[key];
//       } else {
//         return "篡改过数据";
//       }
//     }
//     return cookieObj[key];
//   };
//   return next();
// });
app.use(router.routes());
// app.use(router.allowedMethods());// 方法不支持会产生405
router.get("/write", function (ctx, next) {
  //   ctx.res.setCookie("a", 1, { httpOnly: true, signed: true });
  //   ctx.res.setCookie("b", 2, { path: "/", maxAge: 3 });

  ctx.cookies.set("a", 1, { httpOnly: true, signed: true });
  ctx.cookies.set("b", 2, { path: "/", maxAge: 3 });

  // 为了设置cookie的时候防止客户端篡改，一般情况，服务端需要对设置的cookie增加签名
  ctx.body = "write ok";
});
router.get("/read", function (ctx, next) {
  //   ctx.body = "write ok";
  //   ctx.body = ctx.req.getCookie("a", { signed: true });
  ctx.body = ctx.cookies.get("a", { signed: true }) || "被篡改过";
});
app.listen(3000);

// ctx.body = "write ok";
// domain 控制的是cookie在哪个域下生效，默认是当前域名.
// path   默认是/ 就是以/开头的就可以. 一般不进行设置
// max-age 设置cookie的 生效时间 相对时间
// 后端设置了 httpOnly 后客户端无法读取
//   ctx.res.setHeader("Set-Cookie", [
//     "a=1; httpOnly=true",
//     "b=2; path=/; max-age=3",
//   ]);

// NnAMk4ZdHCeJihslWIe4CTcy3hQ
